/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 *       Filename:  frame.c
 *    Description:  Функций генерации случайного фрейма
 *                  и проверки контрольной суммы
 *
 *        Version:  1.0
 *        Created:  12.02.2013 00:22:53
 *         Author:  Aleksey Golovchenko (lexgolovchenko@gmail.com)
 *   Organization:  St.Petersburg State Polytecnical Universisy
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdio.h>

#include "frame.h"
#include "crc32.h"

static void print_bit_string(void *data, unsigned long len)
{
    int i, j;
    unsigned char *buf = data;

    for (i=0; i<len; ++i) {
        for (j=0; j<8; ++j) {
            fprintf(stderr, "%1d", (buf[i] & (1<<j))!=0);        
        }
    }        
    fprintf(stderr, "\n");
}

/*
 * Заполнения полей данных фрейма случайными данными
 */
void generate_random_frame(frame_t *frame) 
{
    int i, j;    

    memset(frame, 0, FRAME_SIZE);

    for (i=0; i<FRAME_DATA_SIZE; ++i) {        
        frame->data[i] = rand()%(sizeof(8*(*frame->data)));   
    }

    frame->crc = crc32(frame, FRAME_DATA_SIZE);

    fprintf(stderr, "Generate CRC = 0x%X \n", frame->crc);   
    fprintf(stderr, "SRC msg : ");
    print_bit_string(frame, FRAME_SIZE);
}

/*
 * Проверка контрольной суммы
 * 1 - OK
 * 0 - CRC error
 */
int check_frame_crc(frame_t *frame)
{
    unsigned long newcrc = crc32(frame, FRAME_DATA_SIZE);

    fprintf(stderr, "DST msg : ");
    print_bit_string(frame, FRAME_SIZE);
    fprintf(stderr, "Check CRC   = 0x%X \n\n", newcrc);

    return newcrc==frame->crc;
}
